module cl {

    export class TimeReference {
        public constructor(
            public time : number[], // 时间
            public current_step : number, // 当前回合数
            public force_of_step : number, // 当前哪方势力发布指令
            public game_speed : number = -1, // 游戏速度（预留备用）
            public time_of_step : number = 1, // 每回合为1天（预留备用）
            public ticks_of_step : number = 2 // 将一回合分为N帧来计算作战结果
        ){}
    }

    export class ForceMap {
        public constructor(
            public see_map : boolean[],
            public defend_index : number[],
            public pass_index : number[],
        ){}
    }

    export class Force {
        public constructor(
            public name : string,
            public description : string,
            public color : number[],
            public flag : string,
            public tile : Tile,
            public force_hostile_index : number[], // 敌对指数：控制[1]方城市时，该城市对己方的补给容量降低35%，同时用于标识同盟势力和敌对势力
            public force_map : ForceMap
        ){}
    }

    export class TroopType {
        public constructor(
            public name : string,
            public base_image : string, // 标志图标
            public standby_effect : string, // 待命音效
            public plane : number, // 位面 -1:天堂(已死或重组) 0:场内 1:场外
            public man_strength : number, // 每1点strength有多少人
            public attack_efficiency : number[], // 对不同troop_type的攻击力，同时用于标识不可攻击目标
            public attack_range : number, // 攻击距离，即可以间隔多少个网格外攻击，地面部队除火炮部队外均为1,
            public attack_range_decline : number, // 每间隔1格损失0点攻击力，用例如：榴弹炮攻击距离远则精度下降（预留备用）
            public ammo_limit : number, // 满载弹药基数（可连续战斗5天）
            public move_ability : boolean[], // 各land_type的可行性，详见 zone.land_type_def
            public move : number, // 移动速度（每天移动32）
            public fuel_limit : number, // 满载燃油基数（可连续行驶10天）
            public detect_range : number, // 侦查半径（预留备用）
            public conceal_range : number, // 隐藏半径（预留备用）
            public priority : number // 被攻击时的优先级
        ){}
    }

    export class Troop {
        public constructor(
            public name : string, // 部队番号
            public force : number, // 所属：[0]势力
            public troop_type : number, // 部队类型
            public aliasname : string, // 外号
            public emplace_time : number[], // 进入战场时间（用于增援部队）
            public tile : Tile,
            public orientation : number,
            public level : number, // 战力效率（王牌，精英等部队有加成，预备役部队有衰益）
            public morale : number, // 士气效率
            public strength : number, // 有生力量，一般整备师81，整备旅27，整备团9，整备营3，整备连1
            public ammo : number, // 当前弹药基数（可连续战斗5天）
            public fuel : number, // 当前燃油基数（可连续战斗10天）
            public radio_silence : boolean, // 处于无线电静默状态，不会被雷达，电子侦察机发现
            public move_remain : number // 剩余移动力，当需要移动受堵塞时，则可累积移动力。当被牵制被击溃时，负数用于记录恢复时间
        ){}
    }

    export class ZoneTilePair {
        public constructor(
            public from : Tile,
            public to : Tile,
        ){}
    }

    export class ZoneRecharge {
        public constructor(
            public tile : Tile,
            public force : number,
            public recharge_vol : number,
        ){}
    }

    export class ZoneLabel {
        public constructor(
            public tile : Tile,
            public text : string,
        ){}
    }

    export class ZoneWinPoint {
        public constructor(
            public tile : Tile,
            public point : number,
        ){}
    }

    export class Zone {
        public constructor(
            public site : string, // 战斗地点：比利时，荷兰，法国北部
            public landforms : string,
            public center_latlng : number[], // 战场中心点经纬度
            public scale : number, // 比例尺
            public tile_area : number, // 每个格子多少平方千米
            public xsize : number, // 横向格子数
            public ysize : number, // 纵向格子数
            public base_image : string, // 网格基础贴图_框型
            public real_image : string, // 网格基础贴图_填充型，实型
            public mini_image : string, // 网格基础贴图_small
            public land_type_def : string[],
            public land_type_default : number,
            public land_type : number[],
            public defend_index : number[],
            public pass_index : number[],
            public highway_pointpair : ZoneTilePair[],
            public expressway_pointpair : ZoneTilePair[],
            public railway_pointpair : ZoneTilePair[],
            public recharge_point : ZoneRecharge[],
            public label_point : ZoneLabel[],
            public win_point : ZoneWinPoint[]
        ){}
    }

    export class JudgeParam {
        public constructor(
            public tie_damage : number = 0.03, // 在一个tick内伤害超过0.03（伤亡3%），则被牵制，之后1个tick无法自主移动
            public tie_tietimer : number = 2, // 当部队被牵制时刻，tietimer赋值为2
            public tie_threshold : number = 1, // 当tietimer >= 1时，为牵制状态，无法移动
            public tie_morale : number = -0.005, // tick结束时处于牵制状态的额外士气降低

            public hurt_damage : number = 0.06, // 在一个tick内伤害超过0.06（伤亡6%），则被重创，之后3个tick无法自主移动
            public hurt_tietimer : number = 4, // 当部队被重创时刻，tietimer赋值为4
            public hurt_threshold : number = 3, // 当tietimer >= 3时，为重创状态，无法移动
            public hurt_morale : number = -0.01, // tick结束时处于重创状态的额外士气降低

            public retreat_damage : number = 0.09, // 在一个tick内伤害超过0.09（伤亡9%），则被击溃，符合条件则本tick后撤一格，之后5个tick无法自主移动
            public retreat_move_factor : number  = 1.5, //  由击溃产生的移动花费大1.5倍
            public retreat_tietimer : number = 6, // 当部队被击溃时刻，tietimer赋值为5
            public retreat_threshold : number = 5, // 当tietimer >= 4时，为溃退状态
            public retreat_morale : number = -0.02, // tick结束时处于溃败状态的额外士气降低

            public tick_morale : number = -0.005, // 每 1 tick的士气降低（除了休整外，都要做些事）
            public battle_morale : number = -0.01, // 该tick战斗的额外士气降低
            public rest_morale : number = 0.07, // 该tick休整的额外士气增加

            public surrender_morale : number = 0.5 // 如果tick结束时，士气低于0.33，则部队投降
        ){}
    }

    export class CampaignData {
        public constructor(
            public filename : string,
            public filetype : string,
            public version : string,
            public title : string,
            public description : string,
            public time_ref : TimeReference,
            public force : Force[],
            public troop_type : TroopType[],
            public troop : Troop[],
            public zone : Zone
        ){}
    }
}